'''
Created on 14/08/2012

@author: Romina
'''

## -*- coding: utf-8 -*-

if 0:
    None
    import gluon
    import gluon.languages.translator as T
    global response; response = gluon.globals.Response()
    global request; request = gluon.globals.Request()
    global service; service = gluon.tools.Service()
    global crud; crud = gluon.tools.Crud()
    global local_import; local_import = gluon.compileapp.local_import_aux
    from gluon.sqlhtml import SQLFORM
    from gluon.html import BR, DIV, BUTTON
    from repositories.sigecon.mails import BandejaEntradaRepository as bandeja_mails
    from repositories.sigecon.mails import MailConsultaRepository as mails_consulta
    from repositories.sigecon.mails import MailRespuestaRepository as mails_respuesta


import json
import datetime
from domain.mailer.mailer import Mailer
from domain.entities.mail import Mail, MailBandejaEntrada, MailConsulta, MailRespuesta
from domain.config import *

T.force('es-es')



'''carga un json con los datos de un mail de la tabla bandeja de entrada 
segun el id recibido en request.vars'''
def correo_load_mail_entrada():
    mail = MailBandejaEntrada
    mail = bandeja_mails.findOne(request.vars.id_mail)
    diccionario = dict(Fecha = mail.Fecha.strftime("%d/%m/%Y %H:%M"),
                       Subject = mail.Subject,
                       From = Mail.removetags(mail.From),
                       Text = mail.Text)
    return json.JSONEncoder().encode(diccionario)

'''carga un json con los datos de un mail de la tabla consultas segun
el id recibido en request.vars'''
def correo_load_mail_consulta():
    mail = MailConsulta
    mail = mails_consulta.findOne(request.vars.id_mail)
    diccionario = dict(Fecha = mail.Fecha.strftime("%d/%m/%Y %H:%M"),
                       Subject = mail.Subject,
                       From = Mail.removetags(mail.From),
                       Text = mail.Text)
    return json.JSONEncoder().encode(diccionario)

'''carga un json con leido = True si fue leido un mail de la bandeja
o leido = False si no fue leido'''
def correo_is_leido():
    mail = MailBandejaEntrada
    mail = bandeja_mails.findOne(request.vars.id_mail)
    if mail.Leido == True:
        return json.JSONEncoder().encode(dict(leido = True))
    return json.JSONEncoder().encode(dict(leido = False))

'''conecta con el servidor para descargar los mails 
y volcarlos a la tabla bandeja de entrada'''
def correo_load_mails():
    #crea un objeto mailer para obtener  los mensajes del Outlook
    mailer = Mailer(usuario = mail_user, clave = mail_pass)
    #obtiene los mails sin leer de la bandeja de entrada
    mails_bandeja = mailer.read()
    if len(mails_bandeja) > 0:
        for mail_bandeja in mails_bandeja:
            #si el mail de la bandeja no se encuentra en la base
            #entonces lo guarda
            if bandeja_mails.findOneByID_Mail(mail_bandeja.ID_mail) == None:
                bandeja_mails.save(mail_bandeja)
    #retorna todos los mails
    mails = bandeja_mails.findAll()
    data_list = []
    rows = 0
    for m in mails:
        mail = MailBandejaEntrada
        mail = m
        diccionario = dict(id = mail.ID,
                           Leido = mail.Leido,
                           From = mail.From,
                           Subject = mail.Subject,
                           Fecha = mail.Fecha.strftime("%d/%m/%Y %H:%M"))
        data_list.append(diccionario)
        rows = rows + 1
    res = dict(data_list = data_list, rows = rows)
    return json.JSONEncoder().encode(res)

'''elimina un mail de la tabla bandeja segun el id pasado en request.vars'''
def correo_delete():
    bandeja_mails.delete(request.vars.id_mail)
    res = dict(ok = True)
    return json.JSONEncoder().encode(res)

'''devuelve un json con los mails de la tabla mails consulta que 
coincidan con el campo From pasado por request.vars'''
def correo_mails_consulta_by_from():
    mails = mails_consulta.findByFrom(request.vars.from_)
    data_list = []
    rows = 0
    for m in mails:
        mail = MailConsulta
        mail = m
        diccionario = dict(id = mail.ID,
                           From = mail.From,
                           Subject = mail.Subject,
                           Fecha = mail.Fecha.strftime("%d/%m/%Y %H:%M"))
        data_list.append(diccionario)
        rows = rows + 1
    res = dict(data_list = data_list, rows = rows)
    return json.JSONEncoder().encode(res)

'''guarda el mail consulta con el id de la consulta a continuar y
devuelve un json con la ruta a redirigir para enviar la respuesta'''
def correo_continuar():
    
    mail_bandeja = MailBandejaEntrada
    mail_bandeja = bandeja_mails.findOne(request.vars.mail_bandeja)
    
    mail_consulta = MailConsulta
    mail_consulta = mails_consulta.findOne(request.vars.mail_consulta)
    id_consulta_continuar = mail_consulta.idConsulta
    
    entity = MailConsulta(id_consulta_continuar, mail_bandeja.Account, mail_bandeja.ID_mail, mail_bandeja.From, mail_bandeja.To, mail_bandeja.Subject, mail_bandeja.Fecha, mail_bandeja.Fecha_Leido, mail_bandeja.Text)
    idmail = mails_consulta.save(entity)    
        
    url = str(URL(request.application, 'correo', 'correo_responder_mail', vars = dict(idmail = idmail)))

    res = dict(url = url)
    return json.JSONEncoder().encode(res)

'''recibe por request.vars :
  idmail: id del mail de la tabla MailConsultas que se desea responder
  content: contenido del mail de respuesta a enviar
  da de alta un registro en la tabla MailRespuestas y envia el mail al
  destinatario
'''
def correo_send_mail():
    
    mail_consulta = MailConsulta
    mail_consulta = mails_consulta.findOne(request.vars.idmail)
    mail_respuesta = MailRespuesta(mail_consulta, request.vars.content, datetime.datetime.now(), [])
    existe = mails_respuesta.findAllByIdMailConsulta(mail_consulta.ID)
    if existe != None:
        mails_respuesta.save(mail_respuesta)
    try:
        mailer = Mailer(mail_user, mail_pass)
        mailer.send(mail_respuesta)
        return json.JSONEncoder().encode(dict(error = False))
    except Exception :
        return json.JSONEncoder().encode(dict(error = True))
    

@auth.requires_login()  
@auth.requires_membership("MAIL") 
def correo_responder_mail():
    
    if len(request.args) == 0:
        session.flash = DIV(
            DIV("No se pudo redirigir correctamente a 'correo_responder_mail'."),
            DIV("Falta un parametro.")
        )
        redirect(URL(r = request, c = 'errors', f = 'attention'))
    
    mail_consulta = MailConsulta
    mail_consulta = mails_consulta.findOne(request.args[0])
    
    if mail_consulta == None:
        session.flash = DIV(
            DIV("No se encontro la consulta!!")
        )
        redirect(URL(r = request, c = 'errors', f = 'attention'))
    
    form = FORM(
            INPUT(_id = "id_mail", _type = "hidden", _value = mail_consulta.ID),
            INPUT(_id = "id_consulta", _type = "hidden", _value = mail_consulta.idConsulta),
            DIV(_id = "titlepane"),
            DIV(_id = "menu_mail"),
            DIV(_id = "result"),
            DIV(_id = "content_respuesta"))
    
    return dict(title = T("Responder mail"), form = form)


@auth.requires_login()  
@auth.requires_membership("MAIL") 
def correo_resolve():
    if len(request.args) == 0:
        session.flash = DIV(
            DIV("No se pudo redirigir correctamente a 'correo_resolve'"),
            DIV("No se encuentra el mail a responder")
        )
        redirect(URL(r = request, c = 'errors', f = 'attention'))
        
    #buscamos todos los mails con la direccion del recibido
    #para ver si no es una continuacion de consulta
    mail = bandeja_mails.findOne(request.args[0])
    mails = mails_consulta.findByFrom(mail.From)
    if len(mails) == 0:
        ##Iniciar como nueva automaticamente
        redirect(URL(r = request, c = 'comunicacion', f = 'comunicacion_mail', args = [request.args[0]]))
    form = FORM(
              DIV(_id = "grid")
              ,_class = "form_grilla_pendientes")
    return dict(title = "Consultas guardadas de " + mail.From, form = form, from_ = mail.From, id_mail_bandeja = request.args[0]) 
  
''' controlador de la pagina correo_entrada
donde se cargan los mails de la bandeja de entrada '''  
@auth.requires_login()  
@auth.requires_membership("MAIL") 
def correo_entrada():
    form = FORM(
              DIV(_id = "grid")
              ,_class = "form_grilla_pendientes")
    return dict(title = "Bandeja de Entrada", form = form)




    


'''
from domain.scripts.mailer import pop_user, pop_pass
from domain.mailer import Mailer
from domain.model.mail import MailBandejaEntrada
import datetime
import json
from domain.db import DBEmailFactory
from domain.model.mail import MyEncoder


def load_mails():
    #crea un objeto mailer para obtener  los mensajes del Outlook
    mailer = Mailer()
    #obtiene los mails sin leer de la bandeja de entrada
    mails_bandeja = mailer.read(pop_user, pop_pass)
    #servicio de la entidad MailBandejaEntrada
    service = DBEmailFactory(T).mailBandejaEntradaService()
    if len(mails_bandeja) > 0:
        for mail_bandeja in mails_bandeja:
            #si el mail de la bandeja no se encuentra en la base
            #entonces lo guarda
            if service.findMailByIdentificador(mail_bandeja.ID_mail) == None:
                service.save(mail_bandeja)
    
    #retorna todos los mails
    mails = service.findAllMails()
    return MyEncoder().encode(mails)

def load_mails_by_from():
    #crea un objeto mailer para obtener  los mensajes del Outlook
    mailer = Mailer()
    #obtiene los mails sin leer de la bandeja de entrada
    mails_bandeja = mailer.read(pop_user, pop_pass)
    #servicio de la entidad MailBandejaEntrada
    service = DBEmailFactory(T).mailBandejaEntradaService()    
    #retorna todos los mails
    mails = service.findMailsByFrom(request.vars.dir)
    print request.args
    print request.vars
    return MyEncoder().encode(mails)

def redirect_comunicacion_mail(idmail):
    redirect(URL(request.application, 'comunicacion', 'comunicacion_mail', vars = dict(idmail = idmail)))

def redirect_entrada():
    redirect(URL(request.application, 'correo', 'entrada'))

def __menu(idmail, action):
    #se resuelve y se vuelve a recargar la bandeja de entrada
    service = DBEmailFactory(T).mailBandejaEntradaService()
    if action == "delete":
        mail = service.findMailById(idmail)
        service.deleteMail(idmail)
    if action == "responder":
        redirect_comunicacion_mail(idmail)
    
    redirect_entrada()
    
'''   